<?php
namespace App\Models;

use App\Recharge\Enums\ApiGroupEnum;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Symfony\Component\ErrorHandler\Error\FatalError;

/**
* @comment 第三方配置表
*
* @property int $id 编码
* @property string $en 英文名称
* @property string $title 名称
* @property string $recharge_url 下单地址
* @property string $good_url 商品地址
* @property string $order_url 订单查询地址
* @property string $balance_url 余额地址
* @property string $api_data_format 请求方式:form|json
* @property string $api_sync_judge 下单充值结果返回判断 json,空为不进行判读
* @property string $api_sync_data_format 数据格式:array,json,xml;
* @property string $api_sync_err_key 同步回调异常key
* @property int $permission_required 是否需要权限:1=需要,2=不需要
* @property string $appid_title 供应商需要填写的appid 为空则不需要填写
* @property string $private_key_title 供应商需要填写的private(密钥) 为空则不需要填写
* @property string $trade_no_key 第三方订单key .拼接
* @property string $method 请求方式
* @property string $same_api_en 相同的api 可以直接调用别的api 防止代码多余
* @property string $balance_title 余额返回字段
* @property int $default_open 权限默认是否打开:1=是,2=不打开
* @property int $iv_open 是否有iv 1 = 没有 =2 有
* @property int $taxed 1带税 2. 未税
* @property int $key_file 1 = 文字密钥 2 = 文本密钥  密钥格式判断
*
*/
class InterfaceConfiguration extends Model
{

    /**
     * @var string
     */
    protected $connection = 'mysql';
    public $timestamps = false;
    /**
     * @var string
     */
    protected $table = 'interface_configuration';

    /**
     * @var string[]
    */
    protected $fillable = ['id', 'en', 'title', 'recharge_url', 'good_url', 'order_url', 'balance_url', 'api_data_format', 'api_sync_judge', 'api_sync_data_format', 'api_sync_err_key', 'permission_required', 'appid_title', 'private_key_title', 'trade_no_key', 'method', 'same_api_en', 'balance_title', 'default_open', 'iv_open', 'taxed', 'key_file'];

    /**
     * @return ApiGroupEnum
     */
    public function apiGroup(): ApiGroupEnum
    {
        return ApiGroupEnum::identify($this);
    }

    /**
     * @param int|string $value
     * @param string $key
     * @param int|\DateInterval|null $ttl
     * @return static|Builder|null
     */
    public static function findFromCache(int|string $value, string $key = 'id', null|int|\DateInterval $ttl = null): static|Builder|null
    {
        $static = new static();
        $driver = Cache::driver('redis');
        $name = sprintf("%s:%s:%s:%s", $static->getConnectionName(), $static->getTable(), $key, $value);
        $cacheData = $driver->get($name);
        if ($cacheData) {
            $data  = unserialize($cacheData);
        } else {
            $data = $static->newQuery()->firstWhere($key, $value);
            $driver->set($name, serialize($data), $ttl);
        }
        return $data;
    }
}
